package com.boss.salary.service.impl;

import com.boss.common.entity.PageDTO;
import com.boss.common.util.DateUtils;
import com.boss.framework.dto.PaginationDTO;
import com.boss.salary.constant.SystemDictConstant;
import com.boss.salary.dao.ISalaryBaseItemizeDao;
import com.boss.salary.entity.AgencyInfo;
import com.boss.salary.entity.SalaryBaseItemize;
import com.boss.salary.service.ISalaryBaseItemizeService;
import com.boss.sys.ca.user.dto.UserDTO;
import com.boss.sys.utils.SysUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class SalaryBaseItemizeServiceImpl implements ISalaryBaseItemizeService {
    /**
     * 引入日志框架常量
     */
    private final static Logger logger = LoggerFactory.getLogger(SalaryBaseItemizeServiceImpl.class);
    @Autowired
    private ISalaryBaseItemizeDao iSalSalaryBaseItemizeDao;

    @Override
    public PageDTO<SalaryBaseItemize> querySalaryBaseItemizePage(PaginationDTO paginationDTO, Map<String, Object> queryParam) {
        List<SalaryBaseItemize> salSalarys = iSalSalaryBaseItemizeDao.querySalaryBaseItemizePage(paginationDTO, queryParam);
        int total = iSalSalaryBaseItemizeDao.querySalaryBaseItemizeCount(queryParam);
        PageDTO<SalaryBaseItemize> PageDTO = new PageDTO<>();
        PageDTO.setRows(salSalarys);
        PageDTO.setTotal(total);
        return PageDTO;
    }

    @Override
    public List<SalaryBaseItemize> querySalaryBaseItemize(Map<String, Object> queryParam) {
        return iSalSalaryBaseItemizeDao.querySalaryBaseItemize(queryParam);
    }

    @Override
    public List<Map<String, Object>> queryBaseDataList(Map<String, Object> queryParam) {
        return iSalSalaryBaseItemizeDao.queryBaseDataList(queryParam);
    }

    @Override
    public List<Map<String, Object>> queryPayeeAcctList(UserDTO userDTO ) {
        return iSalSalaryBaseItemizeDao.queryPayeeAcctList(userDTO);
    }

    @Override
    public List<Map<String, Object>> querySalaryBasedataList(String agencyId,UserDTO userDTO) {
        return iSalSalaryBaseItemizeDao.querySalaryBasedataList(agencyId,userDTO);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void insertSalaryBaseItemize(List<SalaryBaseItemize> salaryBaseItemizes,UserDTO userDTO) {
        iSalSalaryBaseItemizeDao.deleteSalaryBaseItemize(salaryBaseItemizes.get(0).getAgencyId());
        List<Map<String, Object>> salaryList=iSalSalaryBaseItemizeDao.querySalaryBasedataList("",userDTO);
        Map<String,String> salaryNameMap=new HashMap<>();
        Map<String,String> salaryCodeMap=new HashMap<>();
        for(Map<String, Object> map:salaryList){
            salaryNameMap.put(map.get("id").toString(),map.get("salaryName").toString());
            salaryCodeMap.put(map.get("id").toString(),map.get("salary_code").toString());
        }
        for (SalaryBaseItemize salaryBaseItemize : salaryBaseItemizes) {
            salaryBaseItemize.setId(SysUtils.generateGuid());
            salaryBaseItemize.setCreateTime(String.valueOf(DateUtils.getCurrentTimeStamp()));
            salaryBaseItemize.setUpdateTime(String.valueOf(DateUtils.getCurrentTimeStamp()));
            salaryBaseItemize.setIsDeleted(SystemDictConstant.IS_FALSE);
            salaryBaseItemize.setSalaryBaseCode(salaryCodeMap.get(salaryBaseItemize.getSalaryBaseId()));
            salaryBaseItemize.setSalaryBaseName(salaryNameMap.get(salaryBaseItemize.getSalaryBaseId()));
            iSalSalaryBaseItemizeDao.insertSalaryBaseItemize(salaryBaseItemize,userDTO);
        }
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveSalaryBaseItemizeBatch(SalaryBaseItemize salaryBaseItemize,UserDTO userDTO) {
        //查询当前配置的工资类型工资项是否存在一配置信息，存在返回单位id后续判断使用
       List<String> checkAgencyIds = iSalSalaryBaseItemizeDao.salaryBaseItemizeCheck(salaryBaseItemize);
        List<Map<String, Object>> salaryList=iSalSalaryBaseItemizeDao.querySalaryBasedataList(null,userDTO);
        Map<String,String> salaryNameMap=new HashMap<>();
        Map<String,String> salaryCodeMap=new HashMap<>();
        for(Map<String, Object> map:salaryList){
            salaryNameMap.put(map.get("id").toString(),map.get("salaryName").toString());
            salaryCodeMap.put(map.get("id").toString(),map.get("salary_code").toString());
        }
        List<String> agencyIds = salaryBaseItemize.getAgencyIds();
        for (String agencyId : agencyIds) {
            if (checkAgencyIds.contains(agencyId)) {//若存在已配置信息则不进行保存操作，继续下一条
                continue;
            }
            SalaryBaseItemize sbz = new SalaryBaseItemize();
            sbz.setAgencyId(agencyId);
            sbz.setSalaryBaseId(salaryBaseItemize.getSalaryBaseId());
            sbz.setSalaryBaseCode(salaryBaseItemize.getSalaryBaseCode());
            sbz.setMofDivCode(salaryBaseItemize.getMofDivCode());
            sbz.setPersonState(salaryBaseItemize.getPersonState());
            sbz.setPayeeAcctId(salaryBaseItemize.getPayeeAcctId());
            sbz.setId(SysUtils.generateGuid());
            sbz.setCreateTime(String.valueOf(DateUtils.getCurrentTimeStamp()));
            sbz.setUpdateTime(String.valueOf(DateUtils.getCurrentTimeStamp()));
            sbz.setSalaryBaseCode(salaryCodeMap.get(salaryBaseItemize.getSalaryBaseId()));
            sbz.setSalaryBaseName(salaryNameMap.get(salaryBaseItemize.getSalaryBaseId()));
            sbz.setIsDeleted(SystemDictConstant.IS_FALSE);
            sbz.setRemark(salaryBaseItemize.getRemark());
            iSalSalaryBaseItemizeDao.insertSalaryBaseItemize(sbz,userDTO);
        }
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void copySalaryBaseItemizeBatch(SalaryBaseItemize salaryBaseItemize, UserDTO userDTO) {
        logger.info("agencyId:"+salaryBaseItemize.getAgencyId());
        List<Map<String, Object>> salaryList=iSalSalaryBaseItemizeDao.querySalaryBasedataList(null,userDTO);
        Map<String,String> salaryNameMap=new HashMap<>();
        Map<String,String> salaryCodeMap=new HashMap<>();
        for(Map<String, Object> map:salaryList){
            salaryNameMap.put(map.get("id").toString(),map.get("salaryName").toString());
            salaryCodeMap.put(map.get("id").toString(),map.get("salary_code").toString());
        }
        Map<String, Object> queryParam =new HashMap<>();
        queryParam.put("mof_div_code",userDTO.getProvince());
        queryParam.put("agencyId",salaryBaseItemize.getAgencyId());
        //查询模板单位指标工资项配置
        List<SalaryBaseItemize> sbis=iSalSalaryBaseItemizeDao.querySalaryBaseItemize(queryParam);
        logger.info("agencyIds:"+salaryBaseItemize.getAgencyIds());
        //所复制单位存在指标工资项配置，切存在需复制单位时清除需复制单位原指标工资项
        if(!CollectionUtils.isEmpty(sbis)&&!CollectionUtils.isEmpty(salaryBaseItemize.getAgencyIds())) {
            logger.info("模板"+sbis.toString());
            String datetime=String.valueOf(DateUtils.getCurrentTimeStamp());
            iSalSalaryBaseItemizeDao.deleteSalaryBaseItemizeByAgencyIds(salaryBaseItemize.getAgencyIds(), userDTO.getProvince());
            List<SalaryBaseItemize> newsbiList=new ArrayList<>();
            for(String agencyId:salaryBaseItemize.getAgencyIds()) {
                for (SalaryBaseItemize sbi : sbis) {
                    SalaryBaseItemize sbz = new SalaryBaseItemize();
                    sbz.setAgencyId(agencyId);
                    sbz.setSalaryBaseId(sbi.getSalaryBaseId());
                    sbz.setSalaryBaseCode(sbi.getSalaryBaseCode());
                    sbz.setMofDivCode(sbi.getMofDivCode());
                    sbz.setPersonState(sbi.getPersonState());
                    sbz.setPayeeAcctId(sbi.getPayeeAcctId());
                    sbz.setId(SysUtils.generateGuid());
                    sbz.setCreateTime(datetime);
                    sbz.setUpdateTime(datetime);
                    sbz.setSalaryBaseCode(salaryCodeMap.get(sbi.getSalaryBaseId()));
                    sbz.setSalaryBaseName(salaryNameMap.get(sbi.getSalaryBaseId()));
                    sbz.setIsDeleted(SystemDictConstant.IS_FALSE);
                    sbz.setRemark(sbi.getRemark());
                    newsbiList.add(sbz);
                }
            }
            logger.info("待处理数据："+newsbiList.size());
            iSalSalaryBaseItemizeDao.batchInsertSalaryBaseItemize(newsbiList,userDTO);
        }
    }

    @Override
    public void deleteSalaryBaseItemize(String id) {
        iSalSalaryBaseItemizeDao.deleteSalaryBaseItemize(id);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateSalaryBaseItemize(SalaryBaseItemize salaryBaseItemize) {
        salaryBaseItemize.setUpdateTime(String.valueOf(DateUtils.getCurrentTimeStamp()));
        iSalSalaryBaseItemizeDao.updateSalaryBaseItemize(salaryBaseItemize);
    }

    @Override
    public    List<AgencyInfo>  queryAgencyInfo(List<String> childrenId,String salaCardBank,String personState) {
        return iSalSalaryBaseItemizeDao.queryAgencyInfo(childrenId,salaCardBank,personState);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteSalaryBaseItemizeAll(UserDTO userDTO) {
        iSalSalaryBaseItemizeDao.deleteSalaryBaseItemizeAll(userDTO.getProvince());
    }
}
